home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_02_02 / 2n02019a < prev    next >
Text File  |  1990-12-30  |  15KB  |  483 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dos.h>
  5. #include <conio.h>
  6. #include "defs.h"
  7.  
  8. #define YES    1
  9. #define NO     0
  10. #define ESCAPE 0x1B
  11. #define EGM    0x10
  12. #define VGM    0x12
  13. #define BYTESPERLINE 80
  14.  
  15. UCHAR _far *BiosData       = (UCHAR _far *) 0;
  16. UCHAR _far *BiosFontPtr    = (UCHAR _far *) 0;
  17. UCHAR _far *GraphicsBuffer = (UCHAR _far *) 0;
  18. UCHAR _far *BottomOfMemory = (UCHAR _far *) 0;
  19. UINT  DOS_Extender         = DOS_REALMODE;
  20. UINT  SelectorAliasMask    = 0;
  21.  
  22. USHORT  VideoSelectors[] = 
  23.     {
  24.     0xA000,  /*DOS VGA segment  */
  25.     0x001C,  /*PHARLAP selector */
  26.     0x00D0,  /*OS/286  selector */
  27.     0x00D0,  /*OS/386  selector */
  28.     };
  29.  
  30. typedef struct
  31.    {
  32.    int   Xul;            /* Upper Left X coordinate */
  33.    int   Yul;             /* Upper Left Y coordinate */
  34.    int   Xlr;             /* Lower Left X coordinate */
  35.    int   Ylr;             /* Lower Left Y coordinate */
  36.    int   BorderWidth;     /* Border Width            */
  37.    int   LeftEdgeColor;  /* Left/Top Edge Color     */
  38.    int   RightEdgeColor; /* Right/Bottom Edge Color */
  39.    int   InteriorColor;     /* Interior Window Color   */
  40.    int   BorderFillColor;/* Border Surface Color    */
  41.    int   BorderFillWidth;/* Border Surface Width    */
  42.    int   TitleBarColor;  /* Title Bar Color         */
  43.    int   TitleBarWidth;  /* Title Bar Width         */
  44.    char  Title[129];     /* Title String            */
  45.    }WIN, *WINPTR;
  46.  
  47. WIN  Win = {        200, /* Xul             _A */
  48.                     50, /* Yul             _B */
  49.                    440, /* Xlr             _C */
  50.                    300, /* Ylr             _D */
  51.                      3, /* BorderWidth     _E */
  52.                     15, /* LeftEdgeColor   _F */
  53.                      8, /* RightEdgeColor  _G */
  54.                      3, /* InteriorColor   _H */
  55.                      7, /* BorderFillColor _I */
  56.                      6, /* BorderFillWidth _J */
  57.                      7, /* TitleBarColor   _K */
  58.                     15, /* TitleBarWidth   _L */
  59.        "Clock Demo"};/* Title        _M */
  60.  
  61. #define _A W->Xul             
  62. #define _B W->Yul             
  63. #define _C W->Xlr             
  64. #define _D W->Ylr             
  65. #define _E W->BorderWidth     
  66. #define _F W->LeftEdgeColor   
  67. #define _G W->RightEdgeColor  
  68. #define _H W->InteriorColor   
  69. #define _I W->BorderFillColor 
  70. #define _J W->BorderFillWidth 
  71. #define _K W->TitleBarColor   
  72. #define _L W->TitleBarWidth   
  73. #define _M W->Title           
  74.  
  75. char timedisplay[12] = "  :  :   PM";
  76. UINT last_sec  = 3601;
  77. int  clock_x   = 240;
  78. int  clock_y   = 100;
  79. int  clock_f   =   3; /* Win.InteriorColor */
  80. int  clock_b   =   7; /* Win.TitleBarColor */
  81. int  inputc    = (char) 0xFF;
  82. int  Red       = 0;
  83. int  Green     = 30;
  84. int  Blue      = 30;
  85. int  VideoMode = EGM;
  86. int  VideoModeAtEntry;
  87.  
  88. void   main(void);
  89. void   Initialize(void);
  90. void   KeyStrokeLoop(void);
  91. void   Terminate(void);
  92. void   DrawWin(WINPTR W);
  93. void   SetDAC(int regnum, int red, int green, int blue);
  94. void   WriteTime(void);
  95. UINT   CalcTime(void);
  96. void   UpdateClock(void);
  97. UCHAR  SavRegVGAController(UCHAR IndexReg);
  98. void   SetRegVGAController(UCHAR IndexReg, UCHAR Value);
  99. void   DisplayChar(int c, int x, int y, int fgd, int bkgd);
  100. void   VerticleLine(int x1, int y1, int y2, int n);
  101. void   HorizontalLine(int x1, int y1, int x2, int n);
  102.  
  103. extern void SetVideoMode(int mode);
  104. extern int  GetVideoMode(void);
  105. extern UINT GetExtender(void);
  106. extern void HookTimer(void);
  107. extern void UnHookTimer(void);
  108.  
  109. void main(void)
  110. {
  111.    Initialize();
  112.    KeyStrokeLoop();
  113.    Terminate();
  114. }
  115.  
  116. void Initialize(void)
  117. {
  118.    union REGS regs;
  119.  
  120.    switch (DOS_Extender = GetExtender())
  121.       {
  122.       case ERGO_OS286:
  123.            FP_MAK(BiosData, 0x0000, 0x0040);
  124.        regs.x.AX = 0xE803;/* OS/286 create real window  */
  125.            regs.x.BX = 0x00;  /* SI:BX points to DOS zero   */
  126.            regs.x.CX = 0xFFFF;/* 64K segment length         */
  127.            regs.x.DX = 0x00;  /* high word of window length */
  128.            regs.x.SI = 0x00;
  129.            int86(0x21, ®s, ®s);
  130.            FP_MAK(BottomOfMemory, 0x0000, regs.x.AX);
  131.            regs.x.AX = 0xE803;/* OS/286 create real window  */
  132.            regs.x.BX = 0x00;  /* SI:BX VGA BIOS segment     */
  133.            regs.x.CX = 0xFFFF;/* 64K segment length         */
  134.            regs.x.DX = 0x00;  /* high word of window length */
  135.            regs.x.SI = 0x0C;
  136.            int86(0x21, ®s, ®s);
  137.            FP_MAK(BiosFontPtr, 0x0000, regs.x.AX);
  138.        SelectorAliasMask = 0x0008;
  139.            break;
  140.       #if defined(_I386) || defined(_I486) || defined(__386__)
  141.       case ERGO_OS386:
  142.            FP_MAK(BiosData, 0x0000, 0x0040);
  143.            FP_MAK(BottomOfMemory, 0x0000, 0x0037);
  144.        SelectorAliasMask = 0x0018;
  145.            break;
  146.       case PHARLAP_386:
  147.            FP_MAK(BiosData, 0x0400, 0x0034);
  148.            FP_MAK(BottomOfMemory, 0x0000, 0x0034);
  149.        SelectorAliasMask = 0x0018;
  150.            break;
  151.       #endif
  152.       default:
  153.            FP_MAK(BiosData, 0x0000, 0x0040);
  154.            FP_MAK(BottomOfMemory, 0x0000, 0x0000);
  155.        SelectorAliasMask = 0x0000;
  156.            break;
  157.       }
  158.    FP_MAK(GraphicsBuffer, 0, VideoSelectors[DOS_Extender]);
  159.    VideoModeAtEntry = GetVideoMode();
  160.    SetVideoMode(VideoMode);
  161.    CalcTime();
  162.    HookTimer();
  163. }
  164.  
  165. void KeyStrokeLoop(void)
  166. {
  167.    while(inputc != 'X' && inputc != 'x' && inputc != ESCAPE)
  168.       {
  169.       switch(inputc)
  170.          {
  171.          case 0:
  172.               inputc = getch();
  173.               break;
  174.          case 'R':
  175.          case 'r':
  176.               Red++;
  177.               Red %= 64;
  178.               break;
  179.          case 'G':
  180.          case 'g':
  181.               Green++;
  182.               Green %= 64;
  183.               break;
  184.          case 'B':
  185.          case 'b':
  186.               Blue++;
  187.               Blue %= 64;
  188.               break;
  189.          case 'M':
  190.          case 'm':
  191.               SetVideoMode(VideoMode ^= (VGM-EGM));
  192.               break;
  193.          case 'L':
  194.          case 'l':
  195.               Win.Xul--;
  196.               Win.Xul = max(Win.Xul, 0);
  197.               Win.Yul--;
  198.               Win.Yul = max(Win.Yul, 0);
  199.               Win.Xlr++;
  200.               Win.Xlr = min(Win.Xlr, 639);
  201.               Win.Ylr++;
  202.               Win.Ylr = min(Win.Ylr, 479);
  203.               break;
  204.          case 'S':
  205.          case 's':
  206.               VerticleLine(Win.Xul, Win.Yul, Win.Ylr, 0);
  207.               Win.Xul++;
  208.               Win.Xul = min(Win.Xul, 200);
  209.           HorizontalLine(Win.Xul, Win.Yul, Win.Xlr, 0);
  210.               Win.Yul++;                       
  211.               Win.Yul = min(Win.Yul, 200);
  212.           VerticleLine(Win.Xlr, Win.Yul, Win.Ylr, 0);
  213.               Win.Xlr--;
  214.               Win.Xlr = max(Win.Xlr, 440);
  215.           HorizontalLine(Win.Xul, Win.Ylr, Win.Xlr, 0);
  216.               Win.Ylr--;
  217.               Win.Ylr = max(Win.Ylr, 280);
  218.               break;
  219.          }
  220.       SetDAC(Win.InteriorColor, Red, Green, Blue);
  221.       DrawWin(&Win);
  222.       inputc = getch();
  223.       }    
  224. }
  225.  
  226. void Terminate(void)
  227. {
  228.    SetVideoMode(VideoModeAtEntry);
  229.    UnHookTimer();
  230. }
  231.  
  232. void DrawWin(WINPTR W)
  233. {
  234.    int i, CrossLineStart, CrossHatchStart;
  235.    int TitleLength, TitleStart_x, TitleStart_y;
  236.  
  237.    for (i=0; i< _E; i++)
  238.       {
  239.       VerticleLine(_A+i, _D-i, _B+i,  _F);
  240.       HorizontalLine(_A+i, _B+i, _C-i, _F);
  241.       VerticleLine(_A+_E+_J+i, _D-_E-_J-i, _B+_E+_J+_L+i, _G);
  242.       HorizontalLine(_A+_E+_J+i, _B+_E+_J+_L+i, _C-_E-_J-i, _G);
  243.       VerticleLine(_C-i, _B+i+1, _D-i, _G);
  244.       HorizontalLine(_C-i, _D-i, _A+i+1, _G);
  245.       VerticleLine(_C-_E-_J-i, _B+_E+_J+_L+i+1, _D-_E-_J-i, _F);
  246.       HorizontalLine(_C-_E-_J-i, _D-_E-_J-i, _A+_E+_J+i+1, _F);
  247.       }
  248.    for (i=0; i< _J; i++)
  249.       {
  250.       VerticleLine(_A+_E+i, _D-_E-i, _B+_E+_L+i, _I);
  251.       HorizontalLine(_A+_E+i, _B+_E+_L+i, _C-_E-i, _I);
  252.       VerticleLine(_C-_E-i, _B+_E+_L+i+1, _D-_E-i, _I);
  253.       HorizontalLine(_C-_E-i, _D-_E-i, _A+_E+i+1, _I);
  254.       }
  255.    for (i=_B+_E; i<_B+_E+_L; i++)
  256.        HorizontalLine(_A+_E, i, _C-_E, _K);  
  257.    TitleLength   = min((_C-_A-2*_E)/16, (signed int)strlen(_M));
  258.    TitleStart_x  = _A +